package com.shop.product.service.impl;
import com.shop.common.core.utils.DateUtils;
import com.shop.common.core.utils.StringUtils;
import com.shop.common.security.utils.SecurityUtils;
import com.shop.product.constant.ProductConstant;
import com.shop.product.domain.MallProductInfo;
import com.shop.product.domain.MallProductSkuInfo;
import com.shop.product.domain.req.MallProductInfoForm;
import com.shop.product.mapper.MallProductInfoMapper;
import com.shop.product.service.IPmsSkuInfoService;
import com.shop.product.service.MallProductInfoService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 商品信息Service业务层处理
 *
 * @author czbgradefive
 * @date 2024-05-09
 */
@Service
public class MallProductInfoServiceImpl implements MallProductInfoService {
    @Autowired
    private MallProductInfoMapper mallProductInfoMapper;
    @Autowired
    private IPmsSkuInfoService skuInfoService;

    /**
     * 查询商品信息
     *
     * @param id 商品信息主键
     * @return 商品信息
     */
    @Override
    public MallProductInfo selectMallProductInfoById(Long id) {
        return mallProductInfoMapper.selectMallProductInfoById(id);
    }

    /**
     * 查询商品信息列表
     *
     * @param mallProductInfo 商品信息
     * @return 商品信息
     */
    @Override
    public List<MallProductInfo> selectMallProductInfoList(MallProductInfo mallProductInfo) {
        return mallProductInfoMapper.selectMallProductInfoList(mallProductInfo);
    }

    /**
     * 新增商品信息
     *
     * @param mallProductInfo 商品信息
     * @return 结果
     */
    @Transactional
    @Override
    public int insertMallProductInfo(MallProductInfoForm mallProductInfo) {
        // 获取当前登录用户的ID作为创建者和更新者
        Long userid = SecurityUtils.getLoginUser().getUserid();

        // 设置创建者和更新者信息，以及创建时间
        mallProductInfo.setCreateBy(String.valueOf(userid));
        mallProductInfo.setUpdateBy(String.valueOf(userid));
        mallProductInfo.setCreateTime(DateUtils.getNowDate());

        // 执行插入操作
        int num = mallProductInfoMapper.insertMallProductInfo(mallProductInfo);

        // 调用方法处理数据的保存或更新
        packageDataSaveOrUpdate(mallProductInfo, num, userid);

        // 返回插入操作影响的行数
        return num;
    }

    /**
     * 修改商品信息
     *
     * @param mallProductInfo 商品信息
     * @return 结果
     */
    @Transactional
    @Override
    public int updateMallProductInfo(MallProductInfoForm mallProductInfo) {
        // 获取产品更新步骤
        String step = mallProductInfo.getStep();
        // 如果步骤不为空
        if (StringUtils.isNotBlank(step)) {
            // 根据步骤进行不同的处理
            switch (step) {
                case ProductConstant.STEP_ONE:
                    // 获取产品信息的ID
                    Long productInfoId = mallProductInfo.getId();

                    // 清空SKU信息列表
                    mallProductInfo.setSkuInfoList(null);
                    // 根据产品ID删除所有关联的SKU信息
                    skuInfoService.deleteMallProductSkuInfoByProductId(productInfoId);
                    break;
                case ProductConstant.STEP_TOW:
                    // 清空产品描述信息
                    mallProductInfo.setProductDesc("");
                    break;
                default:
                    break;
            }
        }

        // 设置更新时间为当前时间
        mallProductInfo.setUpdateTime(DateUtils.getNowDate());
        // 获取当前登录用户的ID，并设置为更新者
        Long userid = SecurityUtils.getLoginUser().getUserid();
        mallProductInfo.setUpdateBy(String.valueOf(userid));
        // 更新产品信息，并获取影响的行数
        int num = mallProductInfoMapper.updateMallProductInfo(mallProductInfo);
        // 调用方法处理SKU信息的保存或更新
        packageDataSaveOrUpdate(mallProductInfo, num, userid);
        // 返回影响的行数
        return num;
    }

    /**
     *  保存或更新
     * @param mallProductInfo
     * @param num
     * @param userid
     */
    private void packageDataSaveOrUpdate(MallProductInfoForm mallProductInfo, int num, Long userid) {
        // 获取商品SKU信息列表
        List<MallProductSkuInfo> skuInfoList = mallProductInfo.getSkuInfoList();
        // 如果num大于0且SKU信息列表不为空
        if (num > 0 && CollectionUtils.isNotEmpty(skuInfoList)) {
            // 获取商品信息的ID
            Long productInfoId = mallProductInfo.getId();
            // 删除该商品ID关联的所有SKU信息
            skuInfoService.deleteMallProductSkuInfoByProductId(productInfoId);
            // 创建一个新的SKU信息列表
            ArrayList<MallProductSkuInfo> mallProductSkuInfoList = new ArrayList<>();
            // 遍历原始的SKU信息列表
            for (MallProductSkuInfo item : skuInfoList) {
                // 创建一个新的SKU信息对象，并复制属性
                MallProductSkuInfo mallProductSkuInfo = new MallProductSkuInfo();
                BeanUtils.copyProperties(item, mallProductSkuInfo);
                // 设置SKU信息的商品ID为当前商品信息的ID
                mallProductSkuInfo.setProductId(productInfoId);
                // 设置创建时间为当前时间
                Date createTime = new Date();
                mallProductSkuInfo.setCreateTime(createTime);
                // 设置更新时间为当前时间
                mallProductInfo.setUpdateTime(createTime);
                // 设置更新者和创建者为用户ID的字符串形式
                mallProductSkuInfo.setUpdateBy(String.valueOf(userid));
                mallProductSkuInfo.setCreateBy(String.valueOf(userid));
                // 将新的SKU信息对象加入到列表中
                mallProductSkuInfoList.add(mallProductSkuInfo);
            }
            // 批量插入新的SKU信息列表
            skuInfoService.insertMallProductSkuInfolist(mallProductSkuInfoList);
        }
    }

    /**
     * 批量删除商品信息
     *
     * @param ids 需要删除的商品信息主键
     * @return 结果
     */
    @Override
    public int deleteMallProductInfoByIds(Long[] ids) {
        return mallProductInfoMapper.deleteMallProductInfoByIds(ids);
    }

    /**
     * 删除商品信息信息
     *
     * @param id 商品信息主键
     * @return 结果
     */
    @Override
    public int deleteMallProductInfoById(Long id) {
        return mallProductInfoMapper.deleteMallProductInfoById(id);
    }

    @Override
    public MallProductInfoForm selectMallProductInfoAndSkuInfoById(Long id) {

        return mallProductInfoMapper.selectMallProductInfoAndSkuInfoById(id);
    }


}
